// 请求工具函数
import axios from 'axios'
import { getToken, removeToken, removeUserInfo } from './auth'
import { errorMessage, warningMessage } from './message'
import router from '../router'
import Logger from './Logger.js'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_URL, // 从环境变量中读取api的base_url
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    const token = getToken()
    if (token) {
      // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
      config.headers['Authorization'] = `Bearer ${token}`
    }
    
    // 记录API请求
    const startTime = Date.now();
    config._startTime = startTime;
    Logger.apiRequest(config.url, config.method, config.params, config.data);
    
    return config
  },
  error => {
    // 对请求错误做些什么
    Logger.error('请求错误:', {
      error: error.message,
      stack: error.stack
    })
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 记录API响应
    const endTime = Date.now();
    const startTime = response.config._startTime || endTime;
    Logger.apiResponse(response.config.url, response.config.method, response.status, response.data);
    Logger.logPerformance(`API: ${response.config.method.toUpperCase()} ${response.config.url}`, startTime, endTime);
    
    // 对响应数据做点什么
    const res = response.data
    
    // 全局处理用户信息中的角色格式问题
    // 检查是否是获取用户信息的请求
    if (response.config && response.config.url && 
        (response.config.url.includes('/auth/userInfo') || 
         response.config.url.includes('/api/user/info') ||
         response.config.url.includes('/user/info')) && 
        res.data && typeof res.data === 'object') {
      // 确保用户信息中始终有roles属性且为数组
      const userInfo = res.data
      if (userInfo.role && !userInfo.roles) {
        // 如果有role字段但没有roles字段，将role转换为roles数组
        userInfo.roles = [userInfo.role]
      } else if (!userInfo.roles) {
        // 如果既没有role也没有roles，设置默认空数组
        userInfo.roles = []
      } else if (!Array.isArray(userInfo.roles)) {
        // 如果roles存在但不是数组，转换为数组
        userInfo.roles = [userInfo.roles]
      }
      Logger.info('✅ 全局用户角色格式已自动修复:', userInfo.roles)
    }
    
    // 如果返回的状态码不是200，就统一处理错误
    if (res.code !== 200) {
      // 处理不同状态码的逻辑
      switch (res.code) {
        case 401:
          // 未授权，跳转到登录页
          removeToken()
          removeUserInfo()
          router.replace('/login')
          errorMessage('登录已过期，请重新登录')
          break
        case 403:
          // 禁止访问
          warningMessage('没有权限访问该资源')
          break
        case 404:
          // 资源不存在 - 减少用户干扰
          Logger.warn('请求的资源不存在')
          // 不显示错误提示
          break
        case 500:
          // 服务器错误
          warningMessage('服务器内部错误，请稍后重试')
          break
        default:
          // 其他错误
          warningMessage(res.message || '请求失败')
      }
      
      return Promise.reject(new Error(res.message || 'Error'))
    }
    
    return res
  },
  error => {
    // 对响应错误做点什么
    // 记录错误信息
    if (error.response && error.response.status !== 404) {
      Logger.error('请求处理异常:', {
        message: error.message,
        stack: error.stack
      })
    }
    
    // 判断是否是测试相关API
    const isTestApi = error.config && (
      error.config.url.includes('/api/test-orders') || 
      error.config.url.includes('/api/defects/available')
    )
    
    // 处理HTTP状态码
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 未授权，跳转到登录页
          removeToken()
          removeUserInfo()
          router.replace('/login')
          errorMessage('登录已过期，请重新登录')
          break
        case 403:
          // 禁止访问
          warningMessage('没有权限访问该资源')
          break
        case 404:
          // 资源不存在 - 静默处理，不显示提示
          break
        case 500:
          // 服务器错误
          warningMessage('服务器内部错误，请稍后重试')
          break
        default:
          // 其他错误
          if (!isTestApi) {
            errorMessage(error.response.data.message || '请求失败')
          }
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      if (error.message && error.message.includes('ECONNREFUSED')) {
        if (isTestApi) {
          // 对于测试相关API的连接拒绝错误，不显示错误信息
          // 这些API在调用处已经有mock数据处理
          Logger.warn('测试服务暂时不可用，将使用本地模拟数据')
        } else {
          errorMessage('网络错误，请检查网络连接')
        }
      } else {
        errorMessage('网络错误，请检查网络连接')
      }
    } else {
      // 其他错误
      if (!isTestApi) {
        errorMessage(error.message || '请求失败')
      }
    }
    
    return Promise.reject(error)
  }
)

// 封装GET请求
export const get = (url, params = {}, config = {}) => {
  return service.get(url, {
    params,
    ...config
  })
}

// 封装POST请求
export const post = (url, data = {}, config = {}) => {
  return service.post(url, data, config)
}

// 封装PUT请求
export const put = (url, data = {}, config = {}) => {
  return service.put(url, data, config)
}

// 封装DELETE请求
export const del = (url, params = {}, config = {}) => {
  return service.delete(url, {
    params,
    ...config
  })
}

// 封装PATCH请求
export const patch = (url, data = {}, config = {}) => {
  return service.patch(url, data, config)
}

// 封装文件上传请求
export const upload = (url, file, config = {}) => {
  const formData = new FormData()
  formData.append('file', file)
  
  return service.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    ...config
  })
}

// 封装批量文件上传请求
export const batchUpload = (url, files, config = {}) => {
  const formData = new FormData()
  files.forEach(file => {
    formData.append('files', file)
  })
  
  return service.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    ...config
  })
}

export default service